Для того, чтобы понять необходимость оператора внешнего соединения (outer join) попробуем выдать список сотрудников отделов 30 и 40 с указанием названий отделов. Необходимо выполнить соединение таблиц DEPT и EMP:
SELECT E.ENAME, D.DEPTNO, D.DNAME FROM EMP E, DEPT D WHERE E.DEPTNO=D.DEPTNO AND D.DEPTNO IN (30,40);
Однако при просмотре результата обнаруживаем, что отдел 40 вообще отсутствует и причина этого понятна. В отделе 40 пока нет ни одного сотрудника и потому значению 40 столбца D.DEPTNO не соответствует ни одного значения столбца E.DEPTNO, значит ни одна строка таблицы EMP не будет соединена со строкой описывающей отдел 40 в таблице DEPT. Просматривая выданный результат пользователь будет вынужден подумать о том почему отдел 40 проигнорирован (нет его, неверно составлен запрос, что то еще?), тем более, что при тестировании с другим заполнением таблиц будет получен верный результат).
Обозначается как (+) проставляется на той стороне соединяющего условия (к той таблице), где могут отсутствовать данные. (+) создает пустую строку (строки) и соединяет ее (их) с каждой строкой, не имеющей соответствующих значений.
Изменяем условие WHERE на WHERE E.DEPTNO(+) =D.DEPTNO и получаем верный результат:
ENAME DEPTNO DNAME ----- ------ --------- ALLEN 30 SALES ..... WARD 30 SALES 40 OPERATORS
Ограничения на применение внешнего соединения:
Замечание. Если строки не имеющие пары могут иметься в двух таблицах сразу, используйте объединение UNION (см. ниже).
Если таблица содержит иерархическую структуру, то могут использоваться ее соединения с собой. Чтобы выполнить такое соединение, вводят два разных псевдонима во фразе FROM, например,
Позволяют объединять операторы SELЕСТ, образующие таблицы с одинаковым количеством столбцов, причем соответствующие столбцы должны иметь одинаковый тип.
Именуются столбцы результата по именам столбцов полученных первым SELЕСТ.
Повторяющиеся строки в результате отсутствуют за исключением UNION ALL . Квалификатор DISTINCT не допускается.
Используют:
-- объединение; | ||
-- объединение, но допускается повтор строк; | ||
-- пересечение (выбирает строки, общие для таблиц-операндов; | ||
-- теоретико-множественная разность (строки первого операнда, которых нет во втором операнде); |
1. Напечатаем список сотрудников, содержащий их имена, номера, а также имена и номера их руководителей. Учтите, что в таблице EMP содержатся сведения об иерархической структуре организации. Достигается это тем, что для каждого сотрудника указывается его менеджер (столбец MGR).
SELЕСТ EMPS.EMPNO, EMPS.ENAME, MGRS.EMPNO MGRNO, MGRS. ENAME МGR_NAME FRОМ ЕМР EMPS, EMP MGRS WHERE EMPS.MGR = MGRS.ЕМРNО;
В окне SQL*Plus Вы должны получить следующие значения:
EMPNO ENAME MGRNO MGRNАМЕ ----- ------ ----- ------- 7788 SCOTT 7566 JONES 7902 FORD 7566 JONES 7499 ALLEN 7689 BLAKE 7521 WARD 7689 BLAKE 7654 MARTIN 7689 BLAKE 7844 TURNER 7689 BLAKE 7900 JAMES 7689 BLAKE .... ..... .... .....
2. Найдем должность, на которую были приняты сотрудники в первой половине 1983 года и в тот же период 1984 года.
SELЕСТ JOB FRОМ ЕМР WHERE HIREDATE BETWEEN ’01-JAN-83’ AND ’30-JUN-83’
INTERSECT
SELЕСТ JOB FRОМ ЕМР WHERE HIREDATE BETWEEN ’01-JAN-84’ AND ’30-JUN-84’
В окне SQL*Plus Вы должны получить следующие значения:
JOB -------- CLERK